home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / PROGRAMM / LOGO / H282.ZIP / MSWLOGO.ZIP / EXAMPLES.ZIP / SOLITAIR < prev    next >
Encoding:
Text File  |  1991-09-23  |  9.7 KB  |  527 lines

  1. ;;; Every * has an INT to get around a Mac Berkeley Logo bug!
  2.  
  3. TO ASKDIGIT
  4. MAKE "ONTO LIST "PLAYONTO :CHAR
  5. END
  6.  
  7. TO ASKPARSE :CHAR
  8. IF EQUALP :CHAR "U [ASKU STOP]
  9. IF MEMBERP LIST "PLAYONTO :CHAR :ONTO [ASKDIGIT STOP]
  10. BELL
  11. ASKPARSE RC
  12. END
  13.  
  14. TO ASKSTACKS :LIST
  15. IF EMPTYP :LIST [TYPE [FOR STACK] STOP]
  16. IF EQUALP FIRST FIRST :LIST "PLAYTOP [ASKUP STOP]
  17. SPBTYPE 0 LAST FIRST :LIST
  18. TYPE "| |
  19. ASKSTACKS BF :LIST
  20. END
  21.  
  22. TO ASKU
  23. IFELSE EQUALP FIRST LAST :ONTO "PLAYTOP ~
  24.        [MAKE "ONTO LAST :ONTO] [BELL ASKPARSE RC]
  25. END
  26.  
  27. TO ASKUP
  28. TYPE [FOR STACK,]
  29. SETCURSOR [4 21]
  30. TYPE "OR
  31. SPBTYPE 1 "U
  32. TYPE [| FOR| UP.]
  33. END
  34.  
  35. TO ASKWHICH
  36. SETCURSOR [1 20]
  37. TYPE [PLAY WHERE? |TYPE |]
  38. ASKSTACKS :ONTO
  39. ASKPARSE RC
  40. SETCURSOR [1 20]
  41. SPACES 37 PR []
  42. SPACES 37 PR []
  43. END
  44.  
  45. TO BELL
  46. TONE 1500 6
  47. SETEMPTY "DIGIT
  48. END
  49.  
  50. TO BLACKTYPE :WORD
  51. TYPE STANDOUT :WORD
  52. END
  53.  
  54. TO CARDBEFOREP :A :B
  55. IF EQUALP :A "A [OUTPUT EQUALP :B 2]
  56. IF EQUALP :A 10 [OUTPUT EQUALP :B "J]
  57. IF EQUALP :A "J [OUTPUT EQUALP :B "Q]
  58. IF EQUALP :A "Q [OUTPUT EQUALP :B "K]
  59. IF EQUALP :A "K [OUTPUT "FALSE]
  60. IF NOT NUMBERP :B [OUTPUT "FALSE]
  61. OUTPUT EQUALP :A :B-1
  62. END
  63.  
  64. TO CARDDIS :CARD
  65. IFELSE MEMBERP SUIT :CARD :REDS [REDTYPE :CARD] [BLACKTYPE :CARD]
  66. TYPE "| |
  67. END
  68.  
  69. TO CHEAT
  70. SETCURSOR [1 22] SPACES 3
  71. IF NOT EQUALP :DIGIT 8 [BELL STOP]
  72. IF AND EMPTYP :HAND EMPTYP :PILE [BELL STOP]
  73. LPUSH DEAL "PILE
  74. DISPILE
  75. DISHAND
  76. SETEMPTY "DIGIT
  77. END
  78.  
  79. TO CHECKBLACK :NUM
  80. IF NOT MEMBERP SUIT FIRST :STACK :REDS [STOP]
  81. IF CARDBEFOREP (RANK :CARD) (RANK FIRST :STACK) ~
  82.    [PUSH (LIST "PLAYONTO :NUM) "ONTO]
  83. END
  84.  
  85. TO CHECKEMPTY :NUM
  86. IF EQUALP RANK :CARD "K [PUSH (LIST "PLAYONTO :NUM) "ONTO OUTPUT "TRUE]
  87. OUTPUT "FALSE
  88. END
  89.  
  90. TO CHECKFULL :NUM :STACK
  91. IFELSE MEMBERP SUIT :CARD :REDS [CHECKRED :NUM] [CHECKBLACK :NUM]
  92. END
  93.  
  94. TO CHECKONTO :NUM
  95. IF :NUM = 0 [STOP]
  96. IFELSE STACKEMPTYP SHOWN :NUM ~
  97.        [IF CHECKEMPTY :NUM [STOP]] [CHECKFULL :NUM THING SHOWN :NUM]
  98. CHECKONTO :NUM-1
  99. END
  100.  
  101. TO CHECKRED :NUM
  102. IF MEMBERP SUIT FIRST :STACK :REDS [STOP]
  103. IF CARDBEFOREP (RANK :CARD) (RANK FIRST :STACK) ~
  104.    [PUSH (LIST "PLAYONTO :NUM) "ONTO]
  105. END
  106.  
  107. TO CHECKTOP
  108. IF EQUALP RANK :CARD "A ~
  109.    [IF EMPTYP TOP SUIT :CARD ~
  110.        [PUSH (LIST "PLAYTOP WORD "" SUIT :CARD) "ONTO] ~
  111.     STOP]
  112. IF CARDBEFOREP (TOP SUIT :CARD) (RANK :CARD) ~
  113.    [PUSH (LIST "PLAYTOP WORD "" SUIT :CARD) "ONTO]
  114. END
  115.  
  116. TO COVEREDP
  117. IF EQUALP :WHERE [REMPILE] [OUTPUT "FALSE]
  118. OUTPUT NOT EQUALP :CARD FIRST THING SHOWN LAST :WHERE
  119. END
  120.  
  121. TO DEAL
  122. IF EMPTYP :HAND [MAKE "HAND :PILE SETEMPTY "PILE]
  123. IF EMPTYP :HAND [OUTPUT []]
  124. OUTPUT SPOP "HAND
  125. END
  126.  
  127. TO DECK
  128. OP MAKESUITS (SE :HEART :SPADE :DIAMOND :CLUB)
  129. END
  130.  
  131. TO DISHAND
  132. SETCURSOR [27 23]
  133. TYPE COUNT :HAND
  134. TYPE "| |
  135. END
  136.  
  137. TO DISPILE
  138. SETCURSOR [32 23]
  139. IFELSE EMPTYP :PILE [SPACES 3] [CARDDIS LAST :PILE]
  140. END
  141.  
  142. TO DISSTACK :NUM
  143. SETCURSOR LIST INT (-3+5*:NUM) 4
  144. TYPE IFELSE STACKEMPTYP HIDDEN :NUM ["| |] ["-]
  145. IF STACKEMPTYP SHOWN :NUM ~
  146.    [SETCURSOR LIST INT (-4+5*:NUM) 5 SPACES 3 STOP]
  147. DISSTACK1 :NUM (THING SHOWN :NUM)
  148. END
  149.  
  150. TO DISSTACK1 :NUM :STACK
  151. DISSTACK2 (4+COUNT :STACK) INT (-4+5*:NUM) :STACK
  152. END
  153.  
  154. TO DISSTACK2 :ROW :COL :STACK
  155. IF EMPTYP :STACK [STOP]
  156. SETCURSOR LIST :COL :ROW
  157. CARDDIS FIRST :STACK
  158. DISSTACK2 :ROW-1 :COL BF :STACK
  159. END
  160.  
  161. TO DISSTACKS :NUM
  162. IF :NUM = 0 [STOP]
  163. DISSTACK :NUM
  164. DISSTACKS :NUM-1
  165. END
  166.  
  167. TO DISTOP :SUIT
  168. IF EMPTYP TOP :SUIT [STOP]
  169. IF EQUALP :SUIT :HEART [DISTOP1 4 STOP]
  170. IF EQUALP :SUIT :SPADE [DISTOP1 11 STOP]
  171. IF EQUALP :SUIT :DIAMOND [DISTOP1 18 STOP]
  172. DISTOP1 25
  173. END
  174.  
  175. TO DISTOP1 :COL
  176. SETCURSOR LIST :COL 2
  177. CARDDIS WORD (TOP :SUIT) :SUIT
  178. END
  179.  
  180. TO FINDCARD
  181. IF FINDPILE [STOP]
  182. MAKE "WHERE FINDSHOWN 7
  183. IF EMPTYP :WHERE [BELL]
  184. END
  185.  
  186. TO FINDPILE
  187. IF EMPTYP :PILE [OUTPUT "FALSE]
  188. IF EQUALP :CARD LAST :PILE [MAKE "WHERE [REMPILE] OUTPUT "TRUE]
  189. OUTPUT "FALSE
  190. END
  191.  
  192. TO FINDSHOWN :NUM
  193. IF :NUM = 0 [OUTPUT []]
  194. IF MEMBERP :CARD THING SHOWN :NUM [OP SE "REMSHOWN :NUM]
  195. OP FINDSHOWN :NUM-1
  196. END
  197.  
  198. TO HAND3
  199. IF NOT EMPTYP :DIGIT [BELL STOP]
  200. IF AND EMPTYP :HAND EMPTYP :PILE [BELL STOP]
  201. LPUSH DEAL "PILE
  202. REPEAT 2 [IF NOT EMPTYP :HAND [LPUSH DEAL "PILE]]
  203. DISPILE
  204. DISHAND
  205. END
  206.  
  207. TO HELP
  208. CT
  209. INSTRUCT
  210. SPBPR 0 [TYPE ANY KEY TO CONTINUE]
  211. IGNORE RC
  212. REDISPLAY
  213. END
  214.  
  215. TO HIDDEN :NUM
  216. OUTPUT WORD "HIDDEN :NUM
  217. END
  218.  
  219. TO INITHIDDEN :NUM
  220. SETEMPTY HIDDEN :NUM
  221. REPEAT :NUM [PUSH DEAL HIDDEN :NUM]
  222. END
  223.  
  224. TO INITSTACKS :NUM
  225. IF :NUM = 0 [STOP]
  226. INITHIDDEN :NUM
  227. TURNUP :NUM
  228. INITSTACKS :NUM-1
  229. END
  230.  
  231. TO INSTRUCT
  232. PR [WELCOME TO SOLITAIRE]
  233. PR []
  234. PR [HERE ARE THE COMMANDS YOU CAN TYPE:]
  235. SPBTYPE 4 "+ SPPR 4 [DEAL THREE CARDS ONTO PILE]
  236. SPBTYPE 4 "P SPPR 4 [PLAY TOP CARD FROM PILE]
  237. SPBTYPE 4 "R SPPR 4 [REDISPLAY THE BOARD]
  238. SPBTYPE 4 "? SPPR 4 [RETYPE THESE INSTRUCTIONS]
  239. SPBTYPE 4 "CARD SPPR 1 [PLAY THAT CARD]
  240. PR []
  241. PR [A CARD CONSISTS OF A RANK:]
  242. SPBPR 3 [A 2 3 4 5 6 7 8 9 10 J Q K]
  243. PR [FOLLOWED BY A SUIT:]
  244. SPBPR 3 [H S D C]
  245. PR []
  246. PR [IF YOU MAKE A MISTAKE,]
  247. SPPR 3 [HIT THE SPACE BAR.]
  248. PR []
  249. PR [TO MOVE AN ENTIRE STACK,]
  250. SPPR 3 [HIT THE SHIFTED STACK NUMBER:]
  251. SPBTYPE 5 [! @ # $ % ^ &] SPPR 1 [FOR STACKS]
  252. SPPR 5 [1 2 3 4 5 6 7]
  253. PR []
  254. END
  255.  
  256. TO INVTYPE :TEXT
  257. TYPE STANDOUT :TEXT
  258. END
  259.  
  260. TO LOOP
  261. IF EMPTYP :DIGIT [SETCURSOR [1 22] SPACES 6 SETCURSOR [1 22]]
  262. PARSEKEY RC
  263. LOOP
  264. END
  265.  
  266. TO LPOP :STACK
  267. LOCAL "RESULT
  268. MAKE "RESULT LAST THING :STACK
  269. MAKE :STACK BL THING :STACK
  270. OUTPUT :RESULT
  271. END
  272.  
  273. TO LPUSH :THING :STACK
  274. MAKE :STACK LPUT :THING THING :STACK
  275. END
  276.  
  277. TO MAKESUIT :SUIT :CARDS
  278. IF EMPTYP :CARDS [OUTPUT []]
  279. OUTPUT FPUT (WORD FIRST :CARDS :SUIT) MAKESUIT :SUIT BF :CARDS
  280. END
  281.  
  282. TO MAKESUITS :LIST
  283. IF EMPTYP :LIST [OUTPUT []]
  284. OUTPUT SE MAKESUIT FIRST :LIST [A 2 3 4 5 6 7 8 9 10 J Q K] ~
  285.           MAKESUITS BF :LIST
  286. END
  287.  
  288. TO PARSEDIGIT :CHAR
  289. IF NOT EMPTYP :DIGIT [BELL STOP]
  290. MAKE "DIGIT :CHAR
  291. TYPE :CHAR
  292. END
  293.  
  294. TO PARSEKEY :CHAR
  295. IF MEMBERP :CHAR [1 2 3 4 5 6 7 8 9 A J Q K] [PARSEDIGIT :CHAR STOP]
  296. IF EQUALP :CHAR "0 [PARSEZERO STOP]
  297. IF MEMBERP :CHAR [H S D C] [PARSESUIT :CHAR STOP]
  298. IF MEMBERP :CHAR [+ =] [HAND3 STOP]
  299. IF EQUALP :CHAR "R [REDISPLAY STOP]
  300. IF EQUALP :CHAR "? [HELP STOP]
  301. IF EQUALP :CHAR "P [PLAYPILE STOP]
  302. IF MEMBERP :CHAR [! @ # $ % ^ &] [PLAYSTACK :CHAR [! @ # $ % ^ &] STOP]
  303. IF EQUALP :CHAR "| | [RUBOUT STOP]
  304. IF EQUALP :CHAR "\( [CHEAT STOP]
  305. BELL
  306. END
  307.  
  308. TO PARSESUIT :CHAR
  309. IF EMPTYP :DIGIT [BELL STOP]
  310. IF EQUALP :DIGIT 1 [MAKE "DIGIT "A]
  311. IF EQUALP :CHAR "H [MAKE "CHAR :HEART]
  312. IF EQUALP :CHAR "S [MAKE "CHAR :SPADE]
  313. IF EQUALP :CHAR "D [MAKE "CHAR :DIAMOND]
  314. IF EQUALP :CHAR "C [MAKE "CHAR :CLUB]
  315. TYPE :CHAR
  316. MAKE "CARD WORD :DIGIT :CHAR
  317. SETEMPTY "DIGIT
  318. FINDCARD
  319. IF NOT EMPTYP :WHERE [PLAYCARD]
  320. END
  321.  
  322. TO PARSEZERO
  323. IF NOT EQUALP :DIGIT 1 [BELL STOP]
  324. MAKE "DIGIT 10
  325. TYPE 0
  326. END
  327.  
  328. TO PLAYCARD
  329. SETEMPTY "ONTO
  330. IF NOT COVEREDP [CHECKTOP]
  331. CHECKONTO 7
  332. IF EMPTYP :ONTO [BELL STOP]
  333. IFELSE (COUNT :ONTO) > 1 [ASKWHICH] [MAKE "ONTO FIRST :ONTO]
  334. RUN :WHERE
  335. RUN :ONTO
  336. SETEMPTY "DIGIT
  337. END
  338.  
  339. TO PLAYONTO :NUM
  340. IF EMPTYP :CARDS [DISSTACK :NUM STOP]
  341. PUSH (SPOP "CARDS) SHOWN :NUM
  342. PLAYONTO :NUM
  343. END
  344.  
  345. TO PLAYPILE
  346. IF EMPTYP :PILE [BELL STOP]
  347. IF NOT EMPTYP :DIGIT [BELL STOP]
  348. MAKE "CARD LAST :PILE
  349. MAKE "WHERE [REMPILE]
  350. CARDDIS :CARD
  351. PLAYCARD
  352. END
  353.  
  354. TO PLAYSTACK :WHICH :LIST
  355. IF NOT EMPTYP :DIGIT [BELL STOP]
  356. PLAYSTACK1 :WHICH :LIST 1
  357. END
  358.  
  359. TO PLAYSTACK1 :WHICH :LIST :NUM
  360. IF EQUALP :WHICH FIRST :LIST [PLAYSTACK2 :NUM STOP]
  361. PLAYSTACK1 :WHICH BF :LIST :NUM+1
  362. END
  363.  
  364. TO PLAYSTACK2 :NUM
  365. IF STACKEMPTYP SHOWN :NUM [BELL STOP]
  366. MAKE "CARD LAST THING SHOWN :NUM
  367. MAKE "WHERE SE "REMSHOWN :NUM
  368. CARDDIS :CARD
  369. PLAYCARD
  370. END
  371.  
  372. TO PLAYTOP :SUIT
  373. SETTOP :SUIT RANK :CARD
  374. DISTOP :SUIT
  375. END
  376.  
  377. TO PUSH :THING :STACK
  378. MAKE :STACK FPUT :THING THING :STACK
  379. END
  380.  
  381. TO RANK :CARD
  382. OUTPUT BL :CARD
  383. END
  384.  
  385. TO REDISPLAY
  386. CT
  387. DISSTACKS 7
  388. DISTOP :HEART
  389. DISTOP :SPADE
  390. DISTOP :DIAMOND
  391. DISTOP :CLUB
  392. DISPILE
  393. DISHAND
  394. SETCURSOR [1 22]
  395. SETEMPTY "DIGIT
  396. END
  397.  
  398. TO REDTYPE :WORD
  399. TYPE :WORD
  400. END
  401.  
  402. TO REMOVE :NUM :LIST
  403. IF :NUM = 1 [OUTPUT BF :LIST]
  404. OP FPUT FIRST :LIST REMOVE :NUM-1 BF :LIST
  405. END
  406.  
  407. TO REMPILE
  408. MAKE "CARDS (LIST (LPOP "PILE))
  409. DISPILE
  410. END
  411.  
  412. TO REMSHOWN :NUM
  413. SETEMPTY "CARDS
  414. REMSHOWN1 :NUM 1 (COUNT THING SHOWN :NUM)
  415. IF STACKEMPTYP SHOWN :NUM [TURNUP :NUM DISSTACK :NUM]
  416. END
  417.  
  418. TO REMSHOWN1 :NUM :DEPTH :LENGTH
  419. PUSH (SPOP SHOWN :NUM) "CARDS
  420. IF EQUALP :CARD FIRST :CARDS ~
  421.    [REMSHOWN2 :DEPTH (5+:LENGTH-:DEPTH) INT (-4+5*:NUM) STOP]
  422. REMSHOWN1 :NUM :DEPTH+1 :LENGTH
  423. END
  424.  
  425. TO REMSHOWN2 :DEPTH :ROW :COL
  426. IF :DEPTH = 0 [STOP]
  427. SETCURSOR LIST :COL :ROW
  428. SPACES 3
  429. REMSHOWN2 :DEPTH-1 :ROW+1 :COL
  430. END
  431.  
  432. TO RUBOUT
  433. SETCURSOR [1 22]
  434. SPACES 4
  435. SETCURSOR [1 22]
  436. SETEMPTY "DIGIT
  437. END
  438.  
  439. TO SETEMPTY :STACK
  440. MAKE :STACK []
  441. END
  442.  
  443. TO SETTOP :SUIT :VALUE
  444. MAKE (WORD "TOP :SUIT) :VALUE
  445. END
  446.  
  447. TO SHOWN :NUM
  448. OUTPUT WORD "SHOWN :NUM
  449. END
  450.  
  451. TO SHUFFLE :LEN :LIST
  452. LOCAL "NEW
  453. SETEMPTY "NEW
  454. REPEAT :LEN [SHUFFLE1 1+RANDOM :LEN]
  455. OP :NEW
  456. END
  457.  
  458. TO SHUFFLE1 :RAND
  459. PUSH (ITEM :RAND :LIST) "NEW
  460. MAKE "LIST REMOVE :RAND :LIST
  461. MAKE "LEN :LEN-1
  462. END
  463.  
  464. TO SOLITAIRE
  465. INSTRUCT
  466. PR [SHUFFLING, PLEASE WAIT...]
  467. MAKE "HEART "H
  468. MAKE "SPADE "S
  469. MAKE "DIAMOND "D
  470. MAKE "CLUB "C
  471. MAKE "HAND SHUFFLE 52 DECK
  472. SETEMPTY "PILE
  473. INITSTACKS 7
  474. MAKE "REDS LIST :HEART :DIAMOND
  475. SETTOP :HEART "
  476. SETTOP :SPADE "
  477. SETTOP :DIAMOND "
  478. SETTOP :CLUB "
  479. REDISPLAY
  480. LOOP
  481. END
  482.  
  483. TO SPACES :NUM
  484. REPEAT :NUM [TYPE "| |]
  485. END
  486.  
  487. TO SPBPR :SPACES :TEXT
  488. SPBTYPE :SPACES :TEXT
  489. PR []
  490. END
  491.  
  492. TO SPBTYPE :SPACES :TEXT
  493. SPACES :SPACES
  494. INVTYPE :TEXT
  495. END
  496.  
  497. TO SPOP :STACK
  498. LOCAL "RESULT
  499. MAKE "RESULT FIRST THING :STACK
  500. MAKE :STACK BF THING :STACK
  501. OUTPUT :RESULT
  502. END
  503.  
  504. TO SPPR :SPACES :TEXT
  505. SPACES :SPACES
  506. PR :TEXT
  507. END
  508.  
  509. TO STACKEMPTYP :NAME
  510. OUTPUT EMPTYP THING :NAME
  511. END
  512.  
  513. TO SUIT :CARD
  514. OUTPUT LAST :CARD
  515. END
  516.  
  517. TO TOP :SUIT
  518. OUTPUT THING WORD "TOP :SUIT
  519. END
  520.  
  521. TO TURNUP :NUM
  522. SETEMPTY SHOWN :NUM
  523. IF STACKEMPTYP HIDDEN :NUM [STOP]
  524. PUSH (SPOP HIDDEN :NUM) SHOWN :NUM
  525. END
  526.  
  527.